// 给定一个字符串数组chars，使用如下算法压缩
// 从空字符串s开始，对于chars中每个连续重复字符，1，如果这一组长度为1，则将字符追加到s中，2，如果这一组长度超过1，需要向s追加字符，然后跟这一组的长度
// 如果数组长度为 >= 10,则在chars数组中会被拆分为多个字符
// 设计一个使用常量额外空间的算法来解决此问题

// 思路，

function compress(chars) {
    // 指向压缩后的当前字符串位置
    let slow = 0
    // 指向压缩前的当前字符串位置
    let fast = 0
    while (fast < chars.length) {
        let start = fast
        while (fast + 1 < chars.length && chars[fast] === chars[fast + 1]) {
            fast++
        }
        chars[slow] = chars[fast]
        slow += 1
        if (fast - start > 0) {
            let count = fast - start + 1
            // 注意这里只能不断地除10取余，然后反转
            let i = slow
            while (count !== 0) {
                chars[slow] = String(count % 10)
                count = Math.floor(count / 10)
                slow += 1
            }
            reverse(i, slow - 1)
        }
        fast++
    }
    function reverse(left, right) {
        while (left < right) {
            [chars[left], chars[right]] = [chars[right], chars[left]];
            left += 1
            right -= 1
        }
    }
    return slow
}


// let chars = ["a", "b", "b",  "b", "b", "b", "b",  "b", "b", "b", "b",  "b", "b", "c", "c", "c", "c", "c", "c", "c", "c", "c", "c", "c", "c", "c", "c", "c", "c", "c", "c", "c", "c", "c",]
chars =
    ["a", "b", "b", "b", "b", "b", "b", "b", "b", "b", "b", "b", "b"]
console.log(compress(chars));
console.log(chars)